package com.spzx.product.api;


import com.spzx.common.core.constant.SecurityConstants;
import com.spzx.common.core.constant.ServiceNameConstants;
import com.spzx.common.core.domain.R;
import com.spzx.product.api.factory.RemoteSkuStockFallbackFactory;
import com.spzx.product.vo.SkuLockVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;

import java.util.List;

/**
 * @author GAX
 * @date 2025-10-10
 */

// @FeignClient 是 Spring Cloud OpenFeign 提供的注解，用于声明一个HTTP 客户端接口。
@FeignClient(
        // 为什么要加 contextId ? --- 给这个 Feign 客户端接口一个唯一的 Bean 名称。
        // 如果同一个项目中有多个 Feign 客户端指向相同的服务（即指向的 value 一样）
        // 则必须指定不同的 contextId，否则会 Bean 冲突。
        contextId = "remoteSkuStockService",
        // 指定目标微服务的名称（也就是要调用的服务名），对应注册中心（比如 Nacos、Eureka、Consul）里的服务名。
        value = ServiceNameConstants.PRODUCT_SERVICE,
        // 当远程调用失败（超时、异常、目标服务宕机）时，使用这个工厂创建一个降级（fallback）实例。
        fallbackFactory = RemoteSkuStockFallbackFactory.class
)
public interface RemoteSkuStockService {
    @PostMapping("skuStock/checkAndLock/{orderNo}")
    R<String> checkAndLock(
            @PathVariable("orderNo") String orderNo,
            @RequestBody List<SkuLockVo> skuLockVoList,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source
    );
}
